package cn.tedu.design;

/*单例设计模式方式二===面试重点*/
public class Singleton2 {
    public static void main(String[] args) {
        System.out.println(MySingleton2.getInstance() == MySingleton2.getInstance());
    }
}

class MySingleton2 {
    //先创建本类类型的变量
    private static MySingleton2 mySingleton2;

    //防止外部创建本类对象
    private MySingleton2() {
    }

    //创建一个公共的静态方法
    /*问题：程序中有共享资源single2 并有多条语句操作了共享资源
    * 所以single在多线程下是有数据安全隐患的
    * 解决方案 加锁同步代码块
    * 解决方案2 同步方法[如果一个方法中的代码均需要同步就在方法上加锁]*/
    public static MySingleton2 getInstance() {//可以在方法上加锁
      //  synchronized (this) //this 相当于本类对象的引用 static优先于类而加载，优先于对象所以不可以写this 如果使用对象必须是静态的

        synchronized (MySingleton2.class) {
            if (mySingleton2 == null) {

                mySingleton2 = new MySingleton2();
            }
            return mySingleton2;
        }
    }
}